import java.awt.*;
import java.awt.geom.*;
import java.awt.image.*;

/**
* Beispiel fuer die Verwendung von Texturen
*
* @author Frank Klawonn
* Letzte Aenderung 27.05.2005
*/
public class Texture2DExample extends Frame
{

  //Das zu ladende Bild fuer die Textur wird zunaechst hier gespeichert.
  private Image theImage;

  //Erforderlich fuer TexturePaint.
  private BufferedImage buffi;


  /**
  * Konstruktor
  */
  public Texture2DExample()
  {
    //Ermoeglicht das Schliessen des Fensters
    addWindowListener(new MyFinishWindow());

    //Hier wird das JPEG-Bild fuer die Textur in das Image geladen.
    theImage = new javax.swing.ImageIcon("image1.jpg").getImage();

    //TexturePaint verlangt ein BufferedImage. Daher muss das Image
    //auf ein BufferedImage gezeichnet werden.
    buffi = new BufferedImage(theImage.getWidth(null),
                              theImage.getHeight(null),
                              BufferedImage.TYPE_INT_RGB);

    Graphics2D g2dbuffi = buffi.createGraphics();
    g2dbuffi.drawImage(theImage,0,0,null);
  }


  public void paint(Graphics g)
  {

    Graphics2D g2d = (Graphics2D) g;

    //Rechteck, bzgl. dessen die Textur einmal gezeichnet werden soll.
    Rectangle2D.Double rect = new Rectangle2D.Double(50,90,80,200);


    //Speichern des urspruenglichen Clipping-Bereichs.
    Shape clipShape = g2d.getClip();
    //Clipping bzgl. des Rechtecks
    g2d.setClip(rect);
    //Fuellen von des Rechtecks mit der Textur.
    //Die zu kleine Textur fuellt das Rechteck nicht vollstaendig aus.
    g2d.drawImage(theImage,50,50,null);
    //Ruecksetzen auf den urspruenglichen Clipping-Bereich
    g2d.setClip(clipShape);

    //Zur Verdeutlichung wird der Rand des Rechtecks gezeichnet.
    //Das Rechteck wird nicht vollstaendig von der Textur gefuellt.
    g2d.setStroke(new BasicStroke(3.0f));
    g2d.draw(rect);


    //Fuellen einer Ellipse durch Wiederholung der Textur:
    TexturePaint tp = new TexturePaint(buffi,new Rectangle(0,0,
                                                           buffi.getWidth(),
                                                           buffi.getHeight()));
    g2d.setPaint(tp);
    Ellipse2D.Double elli = new Ellipse2D.Double(250,50,300,500);
    g2d.fill(elli);

  }

  public static void main(String[] argv)
  {

    Texture2DExample f = new Texture2DExample();
    f.setTitle("Texturen");
    f.setSize(600,600);
    f.setVisible(true);
  }

}

